home *** CD-ROM | disk | FTP | other *** search
- // COMUNICA.H
- // (C) Anubis Software Noviembre 1994
- // Libreria para el uso de comunicaciónes entre distintos ordenadores.
- #ifndef COMUNICA.H
- #define COMUNICA.H
-
- // NOTAS DE LA LIBRERIA.
- // ----------------------
- // Esta librería es el interface de todo el servicio de gestión de los
- // puertos de comunicaciones de la Bios. Todas las funciones implementadas
- // en ella, son simples llamadas a una interrupción de la Bios.
- // Por este motivo existen ciertos agujeros en lo que a eficiencia de la
- // librería se refiere. (No es aconsejable usar este sistema para más de 2400 baudios)
- // pués podría suceder que se perdiesen caracteres por el camino.
- //
- // Pero se proporciona un buén interfaz de apoyo a las comunicaciones asincronas por el
- // puerto serie del ordenador.
-
-
- // ------------------------------------+
- // Inclusión de librerías Borland C++ |
- // ------------------------------------+
- #include <conio.h>
- #include <stdio.h>
-
- // ------------------------------------------------------------------+
- // Definición de constantes útiles para las funciones simplificadas. |
- // ------------------------------------------------------------------+
-
- // Constantes que deben utilizarse con prep_comunicacion
- #define _110_BAUDIOS 0
- #define _150_BAUDIOS 32
- #define _300_BAUDIOS 64
- #define _600_BAUDIOS 96
- #define _1200_BAUDIOS 128
- #define _2400_BAUDIOS 160
- #define _4800_BAUDIOS 192
- #define _9600_BAUDIOS 224
- #define _SIN_PARIDAD 0
- #define _PARIDAD_IMPAR 8
- #define _PARIDAD_PAR 24
- #define _1_BIT_PARADA 0
- #define _2_BIT_PARADA 4
- #define _7_BITS_LONG_PALABRA 2
- #define _8_BITS_LONG_PALABRA 3
- // Definición de constantes útiles para las funciones completas.
- // Constantes que deben utilizarse con prep_comp_comunicacion
- #define SIN_INTERRUPCION 0
- #define CON_INTERRUPCION 1
- #define NO_PARIDAD 0
- #define IMPAR_PARIDAD 1
- #define PAR_PARIDAD 2
- #define REP_IMPAR_PARIDAD 3
- #define REP_PAR_PARIDAD 4
- #define STOP_1 0
- #define STOP_2 1
- #define STOP_1_5 1
- #define LONG_5 0
- #define LONG_6 1
- #define LONG_7 2
- #define LONG_8 3
- #define BAUD_110 0
- #define BAUD_150 1
- #define BAUD_300 2
- #define BAUD_600 3
- #define BAUD_1200 4
- #define BAUD_2400 5
- #define BAUD_4800 6
- #define BAUD_9600 7
- #define BAUD_19200 8
- // Definiciones para la variable registro en las funciones completas.
- #define TERMINAL_DATOS_DISPUESTO 1
- #define PETICION_ENVIO 2
- #define SALIDA_1 4
- #define SALIDA_2 8
- #define LAZO 16
- // Definición de los puertos más importantes
- #define COM1 0
- #define COM2 1
- #define COM3 2
- #define COM4 3
- #define COM5 4
- #define COM6 5
- #define COM7 6
- #define COM8 7
- #define COM9 8
- // Definición de los estados más comunes del puerto de comunicación.
- #define CAMBIO_ESTADO_ENVIO_BORRADO 1
- #define CAMBIO_ESTADO_ENVIADOR_DATOS 2
- #define INDICADOR_FLANCO_LLAMADA 4
- #define DETECCION_CAMBIO_LINEA_RECEPCION 8
- #define ENVIAR_BORRADO 16
- #define ENVIADOR_DATOS_LISTO 32
- #define INDICADOR_LLAMADA 64
- #define DETECCION_SEÑAL_RECEPCION 128
- #define DISPUESTO_RECIBIR_DATOS (1<<8)
- #define DETECTADO_ERROR_SOBREESCRITURA (2<<8)
- #define DETECTADO_ERROR_PARIDAD (4<<8)
- #define DETECTADO_ERROR_TRAMA (8<<8)
- #define DETECTADA_INTERRUPCION (16<<8)
- #define REGISTRO_EXTERNO_TRANSMISION_VACIO (32<<8)
- #define REGISTRO_DESPLAZAMIENTO_SALIDA_VACIO (64<<8)
- #define EXCESO_TIEMPO (128<<8)
-
- // ------------------------------------------------------------------+
- // Definición e implementación de los procedimientos de la librería |
- // ------------------------------------------------------------------+
-
- // -------------------------------------------------------------------------
- // result = prep_comp_comunicacion (puerto, velocidad, paridad, parada ,
- // long_palabra, interrupcion);
- //
- // int resul --> Nos da el resultado de preparar la comunicación.
- // int puerto --> Indica el puerto que estamos configurando. (COM1, COM2, etc
- // char velocidad --> Especifica la velocidad en baudios a que configuramos.
- // char paridad --> Especifica los bits de paridad que vamos a utilizar para el puerto.
- // char parada --> Indica los bits de parada que vamos a utilizar 1, 2, 1.5
- // char long_palabra --> Indica la longitud en bytes de la palabra.
- // char interrupcion --> Indica si se tiene que generar una interrupción cuando recibamos un caracter.
- //
- // Practicamente en su totalidad, estos argumentos deben usar las constantes definidas de la librería
- // que están especificadas arriba.
- //
- // Esta función configura el puerto serie de comunicaciones de una forma muy completa.
- // Para ello utiliza la interrupción 14h de la bios, la cual sirve especialmente para
- // ello. (Subfuncion 4h)
- // Devuelve el estado del puerto, y el estado del modem.
- //
- int prep_comp_comunicacion(int puerto, char vel,char paridad,char parada,char long_pal,char interrupcion)
- {
- int salida;
- asm mov ah,04h
- asm mov al,interrupcion
- asm mov bh,paridad
- asm mov bl,parada
- asm mov ch,long_pal
- asm mov cl,vel
- asm mov dx,puerto
- asm int 14h
- asm mov salida,ax
- return(salida);
- }// end rep_comp_comunicacion
-
- // ----------------------------------------------------------------------
- // result = control_comunicacion(puerto, registro);
- //
- // int result --> Devuelve el resultado de la operación.
- // int puerto --> Indica el puerto del que buscamos el estado (COM1, COM2 , etc)
- // char registro --> Ver constantes asociadas (Indican la consulta)
- //
- // El paso de argumentos, es preferible hacerlo con las constantes definidas.
- //
- // Esta función establece el estado del puerto de comunicaciones. Para mantener
- // un cierto control sobre el mismo.
- // Para ello utiliza la interrupción 14h de la Bios (Subfunción 5h)
- //
- int control_comunicacion(int puerto,char registro)
- {
- int salida;
- asm mov ah,05h
- asm mov al,01h
- asm mov bl,registro
- asm mov dx,puerto
- asm int 14h
- asm mov salida,ax
- return(salida);
- }// end control comunicacion
-
- // ---------------------------------------------------------------------
- // result = lee_control_comunicacion (puerto);
- //
- // char result --> Es estado del puerto de comunicaciones.
- // int puerto --> Indica de que puerto serie se trata (COM1, COM2 , etc)
- //
- // Esta función lee el estado del puerto de comunicaciones, para establecer
- // un mayor control del mismo.
- // Para ello utiliza la interrupción 14h de la Bios (Subfunción 5h)
- //
- char lee_control_comunicacion(int puerto)
- {
- char registro;
- asm mov ah,05h
- asm mov al,00h
- asm mov dx,puerto
- asm int 14h
- asm mov registro,bl
- return(registro);
- }// end lee_control_comunicacion
-
- // ------------------------------------------------------------------------
- // result = prep_comunicacion(puerto, velocidad, paridad, parada, long_pal);
- //
- // int result --> Devuelve el estado del puerto de comunicación.
- // char velocidad --> Indica la velocidad en baudios a que queremos poner el puerto.
- // char paridad --> Indica como debe ser el control de paridad.
- // char parada --> Indica los bits de STOP que se utilizan. (1 o 2)
- // char long_pal --> Indica la longitud de la palabra a transmitir
- //
- // Esta función es un subconjunto de pre_comp_comunicacion, con menos opciones,
- // pero que según el caso nos será más útil debido a su mayor sencillez.
- // Igualmente, prepara el puerto de comunicación serie para mantener comunicación.
- // Para ello utiliza la interrupción 14h de la Bios (Subfuncion 00h)
- // NOTA: Las constantes en ambas funciones no son las mismas, cambian de una función a otra
- // Asi, que no debe haber confusión sobre que constantes deben utilizarse.
- // Esta función utiliza todas aquellas que empiezan por el caracter _...
- //
- int prep_comunicacion(int puerto,char velocidad,char paridad,char bits,char long_pal)
- {
- char configuracion;
- int salida;
- configuracion=long_pal | bits | paridad | velocidad;
- asm mov ah,00h
- asm mov al,configuracion
- asm mov dx,puerto
- asm int 14h
- asm mov salida,ax
- return(salida);
- }// end prep_comunicacion
-
- // -------------------------------------------------------------------------
- // result = env_caracter (puerto, caracter);
- //
- // int result --> Devuelve 0 si el envio no se realizo, 1 en caso contrario.
- // int puerto --> Indica en que puerto se envia el caracter.
- // char caracter --> Este es el caracter que queremos enviar por el puerto.
- //
- // Esta función, envia un caracter por el puerto serie.
- // Para ello utiliza la interrupcion 14h de la Bios, (Subfunción 01h)
- //
- int env_caracter(int puerto,char caracter)
- {
- int salida;
- asm mov ah,01h
- asm mov al,caracter
- asm mov dx,puerto
- asm int 14h
- asm mov salida,ax
- if(salida & (1<<15))
- return(0);
- return(1);
- }// end env_caracter
-
- // -----------------------------------------------------------------------
- // result = lee_caracter(puerto, &caracter);
- //
- // int result --> Devuelve 0 si no se pudo enviar el caracter, 1 si fué enviado.
- // int puerto --> Especifica de que puerto en concreto queremos leer el caracter.
- // char caracter --> En este lugar estará el caracter leido.
- //
- // Esta función lee un caracter del puerto serie.
- // Para ello utiliza la interrupción 14h de la Bios (Subfunción 02h)
- //
- int lee_caracter(int puerto,char *caracter)
- {
- int salida;
- char car;
- asm mov ah,02h
- asm mov dx,puerto
- asm int 14h
- asm mov salida,ax
- asm mov car,al
- (*caracter)=car;
- if (salida & (1<<15) ) return(0);
- return(1);
- }// end lee_caracter
-
- // --------------------------------------------------------------------
- // result = est_puerto(puerto);
- //
- // int result --> Devuelve el estado del puerto de comunicación.
- // int puerto --> Especifica de que puerto se obtiene el estado.
- //
- // Esta función retorna el estado del puerto de comunicacíón.
- // Para ello utiliza la interrupción 14 de la Bios, Subfunción (03h)
- int est_puerto(int puerto)
- {
- int salida;
- asm mov ah,03h
- asm mov dx,puerto
- asm int 14h
- asm mov salida,ax
- return(salida);
- }// end est_puerto
-
-
- /*
- main()
- {
- int a;
- char as=' ';
- FILE *handle;
- handle=fopen("mio.txt","wt");
- prep_comunicacion(COM2,_2400_BAUDIOS,_SIN_PARIDAD,_2_BIT_PARADA,_8_BITS_LONG_PALABRA);
- do {
- as = getch();
- while(!env_caracter(COM2,as));
- } while(as != 27) ;
- fclose(handle);
- return(0);
- }
- */
- #endif